//package cn.edu.hit.graphdata;
//
//import cn.edu.hit.CacheManager;
//import cn.edu.hit.kg.data.GraphData;
//import cn.edu.hit.kg.data.Node;
//import cn.edu.hit.kg.entity.BaseNode;
//import cn.edu.hit.kg.entity.Fault;
//import net.sf.json.JSONObject;
//import org.apache.commons.lang3.StringUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.*;
//import java.util.function.Predicate;
//import java.util.stream.Collectors;
//import java.util.stream.Stream;
//
//@RestController
//@RequestMapping("/")
//public class NewController {
//    private static final Logger logger = LoggerFactory.getLogger(NewController.class);
//    public static final CacheManager cacheManager = CacheManager.getInstance();
//    @Autowired
//    HttpServletRequest request;
//
//    @CrossOrigin
//    @RequestMapping(method = RequestMethod.GET, value = "rsfault/faultData/faults/{ids}", produces = "application/json;charset=UTF-8")
//    public JSONObject getFaultByJoinSystemId(@PathVariable("ids") String ids) {
//        String machineNum = "";
//        FaultPortMapping mapping = FaultPortMapping.getInstance();
//        try {
//            String[] idArray = StringUtils.split(ids, ',');
//            if (idArray[0] != null) {
//                machineNum = idArray[0].substring(0, idArray[0].length() - 7);
//            }
//            logger.debug("ArraySize:" + idArray.length);
//
//            GraphData graphData = GraphData.getInstance();
//
//            List<Node> faults2 = graphData.getByLabel("Fault")
//                    .filter(node ->
//                            Stream.of(idArray)
//                                    .map(id -> id.substring(id.length() - 7))
//                                    .anyMatch(Predicate.isEqual(node.get("outId").toString())))
//                    .collect(Collectors.toList());
//
//            List<JSONObject> faults = new ArrayList<>();
//
//            for (int i = 0; i < faults2.size(); i++) {
//                faults.add(packJoinSystemFaultToJsonObject(graphData, faults2.get(i), machineNum));
//
//            }
//
//            logger.debug("FaultSize:" + faults.size());
//
//            List<JSONObject> result = Stream.of(idArray).sequential().map(id -> {
//                Optional<JSONObject> optional = faults.stream().filter(json ->
//                        id.substring(id.length() - 7).equals(json.get("moduleId"))).findAny();
//                if (optional.isPresent()) {
//                    JSONObject jsonObject = JSONObject.fromObject(optional.get());
//                    jsonObject.put("platform_id", id);
//                    FaultPortMapping.FPMapping fpMapping = mapping.getFpMapping().get(id);
//                    if (fpMapping != null) {
//                        jsonObject.put("signalPointIds", fpMapping.portIds);
//                        jsonObject.put("showType", fpMapping.showType);
//                        jsonObject.put("isOpen", fpMapping.isOpen);
//                    } else {
//                        jsonObject.put("isOpen", false);
//                    }
//
//                    logger.debug("In Line128:" + id);
//                    return jsonObject;
//                } else {
//                    logger.warn("Fault " + id + " not found!");
//                    return null;
//                }
//
//            }).filter(x -> x != null).sorted(Comparator.comparingInt(json -> json.optBoolean("isOpen", false) ? -1 : 1)).collect(Collectors.toList());
//
//            return packMessage200(result);
//        } catch (Exception e) {
//            return packMessageError(e);
//        }
//    }
//
//
//    private JSONObject packJoinSystemFaultToJsonObject(GraphData graphData, Node node, String machineNum) {
//        if (node != null && node.hasLabel("Fault")) {
//            Fault faultNode = new Fault(node);
//
//            String freqKey = "fault_reason:" + machineNum + ":" + faultNode.getId();  //每个原因的置信度应该与机器相关
//            List<Map<String, Object>> reasonMatched;
//            if (cacheManager.getJedis().exists(freqKey)) {
//                JSONObject freq = JSONObject.fromObject(cacheManager.getJedis().get(freqKey));
//                reasonMatched = BaseNode.getAllSubNodes(faultNode.getId())
//                        .map(BaseNode::loadNodeById)
//                        .filter(r -> r.node.hasLabel("Reason"))
//                        .map(r -> {
//                            Map<String, Object> map = new HashMap<>();
//                            map.put("name", r.node.get("name"));
//                            map.put("solution", r.node.get("solution"));
//                            int quantum = freq.getInt("quantum");
//                            int frequency = freq.optJSONObject("frequency").optInt("" + r.getId());
//                            map.put("probability", frequency * 1.0 / quantum);
//                            return map;
//                        }).collect(Collectors.toList());
//            } else {
//                reasonMatched = BaseNode.getAllSubNodes(faultNode.getId())
//                        .map(BaseNode::loadNodeById)
//                        .filter(r -> r.node.hasLabel("Reason"))
//                        .map(r -> {
//                            Map<String, Object> map = new HashMap<>();
//                            map.put("name", r.node.get("name"));
//                            map.put("solution", r.node.get("solution"));
//                            int quantum = Integer.parseInt("" + faultNode.node.asMap().getOrDefault("quantum", 100));
//                            int frequency = 0;
//                            if (faultNode.node.asMap().containsKey("frequency")) {
//                                JSONObject freq = JSONObject.fromObject(faultNode.node.asMap().get("frequency"));
//                                frequency = freq.optInt("" + r.getId(), 0);
//                            } else {
//                                map.put("probability", Double.parseDouble(r.getString("probability")));
//                                return map;
//                            }
//                            map.put("probability", frequency * 1.0 / quantum);
//                            return map;
//                        }).collect(Collectors.toList());
//            }
//            List<JSONObject> reasons = new ArrayList<>();
//            for (int i = 0; i < reasonMatched.size(); i++) {
//                JSONObject jsonObject = new JSONObject();
//                jsonObject.put("reasonName", reasonMatched.get(i).get("name"));
//                jsonObject.put("solution", reasonMatched.get(i).get("solution"));
//                jsonObject.put("probability", reasonMatched.get(i).get("probability"));
//                reasons.add(jsonObject);
//            }
//
//            JSONObject json = new JSONObject();
//            json.put("faultId", node.id());
//            json.put("faultName", node.getOrDefault("name", ""));
//            json.put("moduleName", node.getOrDefault("faultModule", ""));
//            json.put("phenomenon", node.getOrDefault("suggest_description", ""));
//            json.put("part", node.getOrDefault("location", ""));
//            json.put("faultLevel", node.get("suggest"));
//            json.put("suggest", node.get("suggest"));
//            json.put("reasons", reasons);
//            json.put("showType", 1);
//            json.put("moduleId", node.get("outId"));
//            return json;
//        } else {
//            logger.warn("Not a valid FaultNode");
//            return new JSONObject(true);
//        }
//    }
//
//
//    private JSONObject packMessageError(Exception e) {
//        return new JSONObject();
//    }
//
//    private JSONObject packMessage200(List<JSONObject> result) {
//        return new JSONObject();
//    }
//
//
//    private JSONObject packJoinSystemFaultToJsonObject(GraphData graphData, Node node) {
//        if (node != null && node.hasLabel("Fault")) {
////            Set<Long> edges = graphData.getEdges().getOrDefault(node.id(), Collections.emptySet());
//            List<JSONObject> reasons = graphData.getAllSubNodes(node.id()).filter(n -> n.hasLabel("Reason")).map(reason -> {
//                JSONObject jsonObject = new JSONObject();
//                jsonObject.put("reasonName", reason.get("name"));
//                jsonObject.put("solution", reason.get("solution"));
//                jsonObject.put("probability", reason.get("probability"));
//                return jsonObject;
//            }).collect(Collectors.toList());
//
//            JSONObject json = new JSONObject();
//            json.put("faultId", node.id());
//            json.put("faultName", node.getOrDefault("name", ""));
//            json.put("moduleName", node.getOrDefault("faultModule", ""));
//            json.put("phenomenon", node.getOrDefault("suggest_description", ""));
//            json.put("part", node.getOrDefault("location", ""));
//            json.put("faultLevel", node.get("suggest"));
//            json.put("suggest", node.get("suggest"));
//            json.put("reasons", reasons);
//            json.put("showType", 1);
//            json.put("moduleId", node.get("outId"));
//            return json;
//        } else {
//            logger.warn("Not a valid FaultNode");
//            return new JSONObject(true);
//        }
//    }
//
//
//    @CrossOrigin
//    @RequestMapping(method = RequestMethod.GET, value = "rsfault/faultData/faults/{ids}", produces = "application/json;charset=UTF-8")
//    public JSONObject getFaultByJoinSystemId2(@PathVariable("ids") String ids) {
//        FaultPortMapping mapping = FaultPortMapping.getInstance();
//        try {
//            String[] idArray = StringUtils.split(ids, ',');
//            if (idArray[0] != null) {
//                final String machineNum = idArray[0].substring(0, idArray[0].length() - 7);
//            }
//            logger.debug("ArraySize:" + idArray.length);
//            GraphData graphData = GraphData.getInstance();
//            List<JSONObject> faults = graphData.getByLabel("Fault")
//                    .filter(node ->
//                            Stream.of(idArray)
//                                    .map(id -> id.substring(id.length() - 7))
//                                    .anyMatch(Predicate.isEqual(node.get("outId").toString())))
//                    .map(node -> packJoinSystemFaultToJsonObject(graphData, node))
//                    .collect(Collectors.toList());
//
//            logger.debug("FaultSize:" + faults.size());
//
//            List<JSONObject> result = Stream.of(idArray).sequential().map(id -> {
//                Optional<JSONObject> optional = faults.stream().filter(json ->
//                        id.substring(id.length() - 7).equals(json.get("moduleId"))).findAny();
//                if (optional.isPresent()) {
//                    JSONObject jsonObject = JSONObject.fromObject(optional.get());
//                    jsonObject.put("platform_id", id);
//                    FaultPortMapping.FPMapping fpMapping = mapping.getFpMapping().get(id);
//                    if (fpMapping != null) {
//                        jsonObject.put("signalPointIds", fpMapping.portIds);
//                        jsonObject.put("showType", fpMapping.showType);
//                        jsonObject.put("isOpen", fpMapping.isOpen);
//                    } else {
//                        jsonObject.put("isOpen", false);
//                    }
//
//                    logger.debug("In Line128:" + id);
//                    return jsonObject;
//                } else {
//                    logger.warn("Fault " + id + " not found!");
//                    return null;
//                }
//
//            }).filter(x -> x != null).sorted(Comparator.comparingInt(json -> json.optBoolean("isOpen", false) ? -1 : 1)).collect(Collectors.toList());
//
//            return packMessage200(result);
//        } catch (Exception e) {
//            return packMessageError(e);
//        }
//    }
//}